1 /*
2 Copyright: Marcelo S. N. Mancini (Hipreme|MrcSnm), 2018 - 2021
3 License:   [https://creativecommons.org/licenses/by/4.0/|CC BY-4.0 License].
4 Authors: Marcelo S. N. Mancini
5 
6 	Copyright Marcelo S. N. Mancini 2018 - 2021.
7 Distributed under the CC BY-4.0 License.
8    (See accompanying file LICENSE.txt or copy at
9 	https://creativecommons.org/licenses/by/4.0/
10 */
11 module hip.event.handlers.keyboard_layout;
12 import hip.event.handlers.keyboard;
13 import hip.util.data_structures;
14 
15 /**
16 *   This class is used for getting user text input based on the keyboard layout implementation
17 */
18 abstract class KeyboardLayout
19 {
20     enum KeyState
21     {
22         NONE = 0,
23         ALT = 1 << 0,
24         CTRL = 1 << 1,
25         SHIFT = 1 << 2,
26     }
27     abstract void initialize();
28     this(){initialize();}
29 
30     protected string[Pair!(char, int)] kb;
31     static alias KeyStroke = Pair!(char, int);
32     
33     pragma(inline, true)
34     final void addKey(char key, string output, KeyState ks = KeyState.NONE)
35     {
36         kb[KeyStroke(key, ks)] = output;
37     }
38 
39     final string getKey(char key, KeyState ks)
40     {
41         string* str = (KeyStroke(key, ks) in kb);
42         if(str == null)
43         {
44             return "";
45         }
46         return *str; 
47     }
48 
49     pragma(inline, true)
50     final void addKeyAnyState(char key, string output)
51     {
52         import std.traits:EnumMembers;
53         int[] members = cast(int[])[EnumMembers!KeyState];
54 
55         for(int i = 0; i < members.length; i++)
56             addKey(key, output, cast(KeyState)members[i]);
57 
58     }
59 
60 
61     final void generateDefaults()
62     {
63         with(HipKey)
64         {
65             addKeyAnyState(SPACE, " ");
66             addKeyAnyState(ENTER, "\n");
67             addKey(_0, "0");
68             addKey(_1, "1");
69             addKey(_2, "2");
70             addKey(_3, "3");
71             addKey(_4, "4");
72             addKey(_5, "5");
73             addKey(_6, "6");
74             addKey(_7, "7");
75             addKey(_8, "8");
76             addKey(_9, "9");
77             
78         }
79     }
80 }
81 
82 
83 class KeyboardLayoutABNT2 : KeyboardLayout
84 {
85     override void initialize()
86     {
87         generateDefaults();
88         with(HipKey)
89         {
90             addKey(A, "a");
91             addKey(B, "b");
92             addKey(C, "c");
93             addKey(D, "d");
94             addKey(E, "e");
95             addKey(F, "f");
96             addKey(G, "g");
97             addKey(H, "h");
98             addKey(I, "i");
99             addKey(J, "j");
100             addKey(K, "k");
101             addKey(L, "l");
102             addKey(M, "m");
103             addKey(N, "n");
104             addKey(O, "o");
105             addKey(P, "p");
106             addKey(Q, "q");
107             addKey(R, "r");
108             addKey(S, "s");
109             addKey(T, "t");
110             addKey(U, "u");
111             addKey(V, "v");
112             addKey(W, "w");
113             addKey(X, "x");
114             addKey(Y, "y");
115             addKey(Z, "z");
116             addKey(MINUS, "-");
117             addKey(EQUAL, "=");
118             addKey(BRACKET_LEFT, "");//Not supported
119             addKey(BRACKET_RIGHT, "[");
120             addKey(BACKSLASH, "]");
121             addKey(SLASH, ";");
122             addKey(PERIOD, ".");
123             addKey(COMMA, ",");
124             addKey(QUOTE, "~");
125             addKey(BACKQUOTE, "'");
126 
127             //Shift
128             addKey(A, "A", KeyState.SHIFT);
129             addKey(B, "B", KeyState.SHIFT);
130             addKey(C, "C", KeyState.SHIFT);
131             addKey(D, "D", KeyState.SHIFT);
132             addKey(E, "E", KeyState.SHIFT);
133             addKey(F, "F", KeyState.SHIFT);
134             addKey(G, "G", KeyState.SHIFT);
135             addKey(H, "H", KeyState.SHIFT);
136             addKey(I, "I", KeyState.SHIFT);
137             addKey(J, "J", KeyState.SHIFT);
138             addKey(K, "K", KeyState.SHIFT);
139             addKey(L, "L", KeyState.SHIFT);
140             addKey(M, "M", KeyState.SHIFT);
141             addKey(N, "N", KeyState.SHIFT);
142             addKey(O, "O", KeyState.SHIFT);
143             addKey(P, "P", KeyState.SHIFT);
144             addKey(Q, "Q", KeyState.SHIFT);
145             addKey(R, "R", KeyState.SHIFT);
146             addKey(S, "S", KeyState.SHIFT);
147             addKey(T, "T", KeyState.SHIFT);
148             addKey(U, "U", KeyState.SHIFT);
149             addKey(V, "V", KeyState.SHIFT);
150             addKey(W, "W", KeyState.SHIFT);
151             addKey(X, "X", KeyState.SHIFT);
152             addKey(Y, "Y", KeyState.SHIFT);
153             addKey(Z, "Z", KeyState.SHIFT);
154 
155             addKey(_1, "!", KeyState.SHIFT);
156             addKey(_2, "@", KeyState.SHIFT);
157             addKey(_3, "#", KeyState.SHIFT);
158             addKey(_4, "$", KeyState.SHIFT);
159             addKey(_5, "%", KeyState.SHIFT);
160             addKey(_6, "¨", KeyState.SHIFT);
161             addKey(_7, "&", KeyState.SHIFT);
162             addKey(_8, "*", KeyState.SHIFT);
163             addKey(_9, "(", KeyState.SHIFT);
164             addKey(_0, ")", KeyState.SHIFT);
165 
166             addKey(MINUS, "_", KeyState.SHIFT);
167             addKey(EQUAL, "+", KeyState.SHIFT);
168             addKey(BRACKET_LEFT, "`", KeyState.SHIFT);
169             addKey(BRACKET_RIGHT, "{", KeyState.SHIFT);
170             addKey(BACKSLASH, "}", KeyState.SHIFT);
171             addKey(SLASH, ":", KeyState.SHIFT);
172             addKey(PERIOD, ">", KeyState.SHIFT);
173             addKey(COMMA, "<", KeyState.SHIFT);
174             addKey(BACKQUOTE, "\"", KeyState.SHIFT);
175 
176             import hip.console.log;
177 
178             rawlog(kb[KeyStroke('A', KeyState.NONE)]);
179             
180         }
181     }
182 }